Date: Sun Mar 1 17:55:29 2020
Scientist: Rasika Hudlikar
Sequencing (Waksman): Dibyendu Kumar
Statistics: Davit Sargsyan
Principal Investigator: Ah-Ng Kong

# Taxonomic Ranks:
# **K**ing **P**hillip **C**an n**O**t **F**ind **G**reen **S**ocks
# * Kingdom                
# * Phylum                    
# * Class                   
# * Order                   
# * Family     
# * Genus     
# * Species  
# options(stringsAsFactors = FALSE,
#         scipen = 999)
# # Increase mmemory size to 64 Gb----
# invisible(utils::memory.limit(65536))
# str(knitr::opts_chunk$get())
# # NOTE: the below does not work!
# knitr::opts_chunk$set(echo = FALSE, 
#                       message = FALSE,
#                       warning = FALSE,
#                       error = FALSE)
# require(knitr)
# require(kableExtra)
require(phyloseq)
# require(shiny)
require(data.table)
require(ggplot2)
require(plotly)
require(DT)
require(lmerTest)
source("source/functions_may2019.R")
# On Windows set multithread=FALSE----
mt <- TRUE

1 Introduction

A/J inbred mice from the Jackson Laboratory are used to model cancer and for carcinogen testing given their high susceptibility to carcinogen-induced tumors.

From Cayman Chemical:Diallyl sulfide is a thioether found in garlic that can modulate the cytochrome P450 drug metabolizing system, activate the constitutive androstane receptor to regulate multidrug resistance-associated proteins, and upregulate the expression of detoxifying enzymes. Garlic-derived organosulfides such as diallyl sulfide have been shown to be highly protective from chemically-induced carcinogenesis in animals.

Nicotine-derived nitrosamine ketone (NNK) is one of the key tobacco-specific nitrosamines derived from nicotine. It plays an important role in carcinogenesis.

Nine (9) A/J mice were used in this study, 3 in each of the 3 treatment groups: Vehicle control (VC), NNK control and NNK+DAS. The study design is as follows:

DAS in corn oil was force-fed to mice throghout the study (weeks 0 to 6). A single dose of 24uM/0.1mL NNK suspended in glyceryl trioctate vehicle was injected at Week 1 intraperetoneally (IP). The vehicvle control group received vehicle only. Fecal samples were collected at 4 timepoints: before DAS treatment began (Week 0), and 1, 2 and 4 weeks after pretreatment (Week 1, Week 2 and Week 4 respectively).

2 Data preprocessing

2.1 Raw Data

FastQ files were downloaded from Rutgers Box. A total of 72 files (2 per sample, pair-ended) were downloaded.

2.2 Script

This script (nrf2ubiome_dada2_jan2020_v1.Rmd) was developed using DADA2 Pipeline Tutorial (1.12) with tips and tricks from the University of Maryland Shool of Medicine Institute for Genome Sciences (IGS) Microbiome Analysis Workshop (April 8-11, 2019). The output of the DADA2 script (data_jan2020/ps_jan2020.RData) is explored in this document.

3 Meta data: sample description

# Load data----
# Counts
load("data_jan2020/ps_jan2020.RData")
ps_jan2020@sam_data
Sample Data:        [36 samples by 4 sample variables]:
# Taxonomy
load("data_jan2020/taxa.RData")
taxa <- data.table(seq16s = rownames(taxa),
                   taxa)
head(taxa)

CONTINUE HERE!!! 02/29/2020

4 Samples

ps_jan2020@sam_data$Treatment <- factor(ps_jan2020@sam_data$Treatment,
                                        levels = c("NNK control",
                                                   "Vehicle control (VC)",
                                                   "NNK+DAS"))
ps_jan2020@sam_data$ID <- factor(ps_jan2020@sam_data$ID,
                                 levels = unique(ps_jan2020@sam_data$ID))
ps_jan2020@sam_data$Week <- factor(ps_jan2020@sam_data$Week,
                                   levels = c("Week0",
                                              "Week1",
                                              "Week2",
                                              "Week4"))
samples <- ps_jan2020@sam_data
datatable(samples,
          options = list(pageLength = nrow(samples)))

5 Prune data

The OTUs were mapped to Bacteria (98.45%) and Eukaryota (1.30%) kingdoms, and 16 OTUs (0.26%) undefined.

The total of 6,174 unique sequences were found. Out of those, 6,078 were mapped to bacterial genomes.

dim(ps_jan2020@otu_table@.Data)
[1]   36 6174
# Remove OTU not mapped to Bacteria
ps0 <- subset_taxa(ps_jan2020, 
                   Kingdom == "Bacteria")
dim(ps0@otu_table@.Data)
[1]   36 6078

Out of the 6,078 OTUs 6,044 belonged to 13 Phylum. 34 of the OTUs (or 0.56% of bacterial OTUs) could not be mapped to a phylum.

t2 <- data.table(table(tax_table(ps0)[, "Phylum"],
                                  exclude = NULL))
t2$V1[is.na(t2$V1)] <- "Unknown"
setorder(t2, -N)
t2[, pct := N/sum(N)]
setorder(t2, -N)
colnames(t2) <- c("Phylum",
                  "Number of OTUs",
                  "Percent of OTUs")
datatable(t2,
          rownames = FALSE,
          caption = "Number of Bacterial OTUs by Phylum",
          class = "cell-border stripe",
          options = list(search = FALSE,
                         pageLength = nrow(t2))) %>%
  formatCurrency(columns = 2,
                 currency = "",
                 mark = ",",
                 digits = 0) %>%
  formatPercentage(columns = 3,
                   digits = 2)

6 OTU table (first 10 rows)

7 Total counts per sample (i.e. sequencing depth)

t1 <- colSums(otu[, 7:ncol(otu)])
t1 <- data.table(SAMPLE_NAME = names(t1),
                 Total = t1)
t2 <- data.table(SAMPLE_NAME = rownames(samples),
                 ID = samples$ID,
                 TREATMENT = samples$Treatment,
                 WEEK = samples$Week)
smpl <- merge(t1,
              t2,
              by = "SAMPLE_NAME")
p1 <- ggplot(smpl,
             aes(x = SAMPLE_NAME,
                 y = Total,
                 fill = TREATMENT,
                 colour = WEEK)) +
  geom_bar(stat = "identity") +
  scale_x_discrete("") +
  scale_y_continuous("Number of Reads") +
  scale_fill_discrete("Treatment") +
  theme(axis.text.x = element_text(angle = 45,
                                   hjust = 1)) 
ggplotly(p1)

8 Richness (Alpha diversity)

Shannon index (aka Shannon enthrophy) is calculated as:
H’ = -sum(1 to R)p(i)ln(p(i)) When there is exactly 1 type of data (e.g. a single species in the sample), H’=0. The opposite scenario is when there are R>1 species present in the sample in the exact same amounts and H’=ln(R).

Shannon’s diversity index was calculated for each sample and ploted over time using the 7,764 from the 13 Phylum above.

shannon.ndx <- estimate_richness(ps0,
                                 measures = "Shannon")
shannon.ndx <- data.table(SAMPLE_NAME = rownames(shannon.ndx),
                          shannon.ndx)
smpl <- merge(smpl,
              shannon.ndx,
              by = "SAMPLE_NAME")
p1 <- ggplot(smpl,
             aes(x = Total,
                 y = Shannon,
                 # shape = WEEK,
                 fill = WEEK)) +
  geom_point(size = 2,
             shape = 21) +
  scale_fill_manual(breaks = unique(smpl$WEEK),
                    values = c("white",
                               "red",
                               "green",
                               "blue"))
  # scale_shape_manual(breaks = unique(smpl$WEEK),
  #                    values = 21:24)
tiff(filename = "tmp/shannon_vs_depth.tiff",
     height = 5,
     width = 6,
     units = "in",
     res = 600,
     compression = "lzw+p")
print(p1)
graphics.off()
ggplotly(p1)

Even though estimate_richness function does not adjust for the sequencing depth, there is no correlation between the index and the sample’s sequecing depth. Proceed with the comparison.

9 Shannon idex over time

p1 <- plot_richness(ps0,
                    x = "Week", 
                    measures = "Shannon") +
  facet_wrap(~ Treatment) +
  geom_line(aes(group = ID),
            color = "black") +
  geom_point(aes(fill = Treatment),
             shape = 21,
             size = 3,
             color = "black") +
  scale_x_discrete("") +
  theme(axis.text.x = element_text(angle = 30,
                                   hjust = 1,
                                   vjust = 1))
ggplotly(p = p1,
         tooltip = c("ID",
                     "value"))

p1 <- p1 + 
  scale_fill_discrete("") +
  theme(legend.position = "top")
tiff(filename = "tmp/shannon.tiff",
     height = 4,
     width = 5,
     units = "in",
     res = 600,
     compression = "lzw+p")
print(p1)
graphics.off()

The plot above suggests that the largest differences in alpha diversity (as measured by Shannon’s index) are in genotype.

Test if the richness changed between the baseline and Week 8.

smpl$TREATMENT <- factor(smpl$TREATMENT,
                         levels = c("DSS",
                                    "Naive",
                                    "DSS+PEITC",
                                    "DSS+Cranberry"))

tmp <- droplevels(smpl[WEEK != "week1"])

m1 <- lm(Shannon  ~ WEEK*(TREATMENT + Genotype),
         # offset = Total,
         data = tmp)
summary(m1)
m2 <- lmer(Shannon  ~ WEEK*(TREATMENT + Genotype) + (1 | ID),
           # offset = Total,
           data = tmp)
summary(m2)

10 Calculate change in Shannon index from baseline

dd <- smpl
dd[, delta := Shannon - Shannon[WEEK == "baseline"],
   by = ID]
dd$diff <- paste(dd$WEEK,
                 "-baseline",
                 sep = "")

dd <- dd[WEEK != "baseline",]

p1 <- ggplot(dd,
             aes(x = TREATMENT,
                 y = delta,
                 fill = Genotype)) +
  facet_wrap(~ diff) +
  geom_hline(yintercept = 0,
             linetype = "dashed") +
  geom_point(position = position_dodge(0.3),
             shape = 21,
             size = 3) +
  scale_y_continuous("Shannon Index Percent Change from Baseline") +
  theme(axis.text.x = element_text(angle = 45,
                                   hjust = 1))
print(p1)

dd1$TREATMENT <- factor(dd1$TREATMENT,
                        levels = c("DSS",
                                   "Naive",
                                   "DSS+PEITC",
                                   "DSS+Cranberry"))
dd1$Genotype <- factor(dd1$Genotype,
                       levels = c("widetype",
                                  "nrf2KO"))

m1 <- lm(delta ~ TREATMENT*Genotype,
         data = dd1)
summary(m1)

# No significant interactions, proceed with 2-way analysis
m2 <- lm(delta ~ TREATMENT + Genotype,
         data = dd1)
summary(m2)

At Week 8 there was significantly smaller increase of alpha diversity from baseline in Nrf2 KO compared to WT, and in DSS+Cranberry compared to DSS only.

11 Load aminoacids

aa <- fread("data_jan2020/jan2020_aminoacids.csv")

CONTINUE HERE! (2/11/2020)

The results showed that…

12 Remove unmapped OTUs

The 311 unmapped OTUs were removed from further analysis (with 7,247 OTUs left).

ps1 <- subset_taxa(ps0, 
                   !is.na(Phylum))
dim(ps1@otu_table@.Data)

13 Counts at Phylum level

14 Relative abundance (%) at Phylum level

Remove phyla with relative abundance of >= 1% in less than 10% of samples.

t1 <- data.table(Phylum = ra_p$Phylum,
                 `Number of Samples` = rowSums(ra_p[, 2:ncol(ra_p)] >= 0.01))
t1$`Percent Samples` <-  t1$`Number of Samples`/72

setorder(t1, -`Number of Samples`)
datatable(t1,
          rownames = FALSE,
          caption = "Taxonomic  count table",
          class = "cell-border stripe",
          options = list(search = FALSE,
                         pageLength = nrow(t1))) %>%
  formatPercentage(columns = 3,
                   digits = 1)

We will remove Chlamydiae from this analysis.

XX OTUs, down from YY OTUs in the previous table.

15 Relative Abundance in Samples at Different Taxonomic Ranks

15.1 1. Class

mu$Trt_Genotype <- factor(paste(mu$Treatment,
                          mu$Genotype,
                          sep = "_"))

p0 <- ggplot(mu,
             aes(x = Week,
                 y = x,
                 group = Trt_Genotype)) +
  facet_wrap(~ Class,
             scale = "free_y") +
  geom_line(position = position_dodge(0.3)) +
  geom_point(aes(fill = Trt_Genotype),
             shape = 21,
             size = 2,
             alpha = 0.5,
             position = position_dodge(0.3)) +
  scale_x_discrete("") +
  scale_y_continuous("Relative Abundance (%)") +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 45,
                                   hjust = 1))

tiff(filename = "tmp/wt_class_over_time.tiff",
     height = 5,
     width = 7,
     units = "in",
     res = 600,
     compression = "lzw+p")
print(p0)
graphics.off()

print(p0)
p1 <- ggplot(mu,
             aes(x = x,
                 y = Class,
                 color = Trt_Genotype,
                 shape = Week)) +
  geom_point(size = 3,
             alpha = 0.5) +
  geom_vline(xintercept = 1,
             linetype = "dashed") +
  scale_x_continuous("Relative Abundance (%)") +
  theme(legend.position = "top")

tiff(filename = "tmp/wt_class_ra.tiff",
     height = 4,
     width = 7,
     units = "in",
     res = 600,
     compression = "lzw+p")
print(p1)
graphics.off()

ggplotly(p1)

15.2 2. Order

mu$Trt_Genotype <- factor(paste(mu$Treatment,
                                mu$Genotype,
                                sep = "_"))

p0 <- ggplot(mu,
             aes(x = Week,
                 y = x,
                 group = Trt_Genotype)) +
  facet_wrap(~ Order,
             scale = "free_y") +
  geom_line(position = position_dodge(0.3)) +
  geom_point(aes(fill = Trt_Genotype),
             shape = 21,
             size = 2,
             alpha = 0.5,
             position = position_dodge(0.3)) +
  scale_x_discrete("") +
  scale_y_continuous("Relative Abundance (%)") +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 45,
                                   hjust = 1))

tiff(filename = "tmp/wt_Order_over_time.tiff",
     height = 5,
     width = 7,
     units = "in",
     res = 600,
     compression = "lzw+p")
print(p0)
graphics.off()

print(p0)
p1 <- ggplot(mu,
             aes(x = x,
                 y = Order,
                 color = Trt_Genotype,
                 shape = Week)) +
  geom_point(size = 3,
             alpha = 0.5) +
  geom_vline(xintercept = 1,
             linetype = "dashed") +
  scale_x_continuous("Relative Abundance (%)") +
  theme(legend.position = "top")

tiff(filename = "tmp/wt_Order_ra.tiff",
     height = 4,
     width = 7,
     units = "in",
     res = 600,
     compression = "lzw+p")
print(p1)
graphics.off()

ggplotly(p1)

15.3 3. Family

NOTE: only the first 24 families had large enough counts - ploting only them.

mu$Trt_Genotype <- factor(paste(mu$Treatment,
                                mu$Genotype,
                                sep = "_"))
mu1 <- droplevels(mu[Family %in% levels(mu$Family)[nlevels(mu$Family):(nlevels(mu$Family) - 24)], ])

p0 <- ggplot(mu1,
             aes(x = Week,
                 y = x,
                 group = Trt_Genotype)) +
  facet_wrap(~ Family,
             scale = "free_y") +
  geom_line(position = position_dodge(0.3)) +
  geom_point(aes(fill = Trt_Genotype),
             shape = 21,
             size = 2,
             alpha = 0.5,
             position = position_dodge(0.3)) +
  scale_x_discrete("") +
  scale_y_continuous("Relative Abundance (%)") +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 45,
                                   hjust = 1))

tiff(filename = "tmp/wt_Family_over_time.tiff",
     height = 7,
     width = 9,
     units = "in",
     res = 600,
     compression = "lzw+p")
print(p0)
graphics.off()

print(p0)
p1 <- ggplot(mu1,
             aes(x = x,
                 y = Family,
                 color = Trt_Genotype,
                 shape = Week)) +
  geom_point(size = 3,
             alpha = 0.5) +
  geom_vline(xintercept = 1,
             linetype = "dashed") +
  scale_x_continuous("Relative Abundance (%)") +
  theme(legend.position = "top")

tiff(filename = "tmp/wt_Family_ra.tiff",
     height = 4,
     width = 7,
     units = "in",
     res = 600,
     compression = "lzw+p")
print(p1)
graphics.off()

ggplotly(p1)

15.4 4. Genus

mu$Trt_Genotype <- factor(paste(mu$Treatment,
                                mu$Genotype,
                                sep = "_"))
mu1 <- droplevels(mu[Genus %in% levels(mu$Genus)[nlevels(mu$Genus):(nlevels(mu$Genus) - 35)], ])

p0 <- ggplot(mu1,
             aes(x = Week,
                 y = x,
                 group = Trt_Genotype)) +
  facet_wrap(~ Genus,
             scale = "free_y") +
  geom_line(position = position_dodge(0.3)) +
  geom_point(aes(fill = Trt_Genotype),
             shape = 21,
             size = 2,
             alpha = 0.5,
             position = position_dodge(0.3)) +
  scale_x_discrete("") +
  scale_y_continuous("Relative Abundance (%)") +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 45,
                                   hjust = 1))

tiff(filename = "tmp/wt_Genus_over_time.tiff",
     height = 9,
     width = 12,
     units = "in",
     res = 600,
     compression = "lzw+p")
print(p0)
graphics.off()

print(p0)
p1 <- ggplot(mu1,
             aes(x = x,
                 y = Genus,
                 color = Trt_Genotype,
                 shape = Week)) +
  geom_point(size = 3,
             alpha = 0.5) +
  geom_vline(xintercept = 1,
             linetype = "dashed") +
  scale_x_continuous("Relative Abundance (%)") +
  theme(legend.position = "top")

tiff(filename = "tmp/wt_Genus_ra.tiff",
     height = 9,
     width = 9,
     units = "in",
     res = 600,
     compression = "lzw+p")
print(p1)
graphics.off()

ggplotly(p1)

16 Session Information

sessionInfo()
LS0tCnRpdGxlOiAiR3V0IE1pY3JvYmltZSBSb2xlIGluIERpYWxseWwgU3VsZmlkZSAoREFTKSBJbmhpYml0aW5nIE5OSy1JbmR1Y2VkIENhbmNlciBpbiBBL0ogTWljZSBNb2RlbCwgSmFudWFyeSAyMDIwIGJhdGNoIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKLS0tCkRhdGU6IGByIGRhdGUoKWAgICAgIApTY2llbnRpc3Q6IFtSYXNpa2EgSHVkbGlrYXJdKHJhc2lrYWh1ZGxpa2FyQGdtYWlsLmNvbSkgICAgICAKU2VxdWVuY2luZyAoV2Frc21hbik6IFtEaWJ5ZW5kdSBLdW1hcl0obWFpbHRvOmRrQHdha3NtYW4ucnV0Z2Vycy5lZHUpICAgICAgClN0YXRpc3RpY3M6IFtEYXZpdCBTYXJnc3lhbl0obWFpbHRvOnNhcmdkYXZpZEBnbWFpbC5jb20pICAgICAgClByaW5jaXBhbCBJbnZlc3RpZ2F0b3I6IFtBaC1OZyBLb25nXShtYWlsdG86a29uZ3RAcGhhcm1hY3kucnV0Z2Vycy5lZHUpIAoKYGBge30KIyBUYXhvbm9taWMgUmFua3M6CiMgKipLKippbmcgKipQKipoaWxsaXAgKipDKiphbiBuKipPKip0ICoqRioqaW5kICoqRyoqcmVlbiAqKlMqKm9ja3MKIyAqIEtpbmdkb20gICAgICAgICAgICAgICAgCiMgKiBQaHlsdW0gICAgICAgICAgICAgICAgICAgIAojICogQ2xhc3MgICAgICAgICAgICAgICAgICAgCiMgKiBPcmRlciAgICAgICAgICAgICAgICAgICAKIyAqIEZhbWlseSAgICAgCiMgKiBHZW51cyAgICAgCiMgKiBTcGVjaWVzICAKYGBgCgpgYGB7ciBzZXR1cH0KIyBvcHRpb25zKHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSwKIyAgICAgICAgIHNjaXBlbiA9IDk5OSkKCiMgIyBJbmNyZWFzZSBtbWVtb3J5IHNpemUgdG8gNjQgR2ItLS0tCiMgaW52aXNpYmxlKHV0aWxzOjptZW1vcnkubGltaXQoNjU1MzYpKQoKCiMgc3RyKGtuaXRyOjpvcHRzX2NodW5rJGdldCgpKQojICMgTk9URTogdGhlIGJlbG93IGRvZXMgbm90IHdvcmshCiMga25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgCiMgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwKIyAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLAojICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEZBTFNFKQoKIyByZXF1aXJlKGtuaXRyKQojIHJlcXVpcmUoa2FibGVFeHRyYSkKcmVxdWlyZShwaHlsb3NlcSkKIyByZXF1aXJlKHNoaW55KQoKcmVxdWlyZShkYXRhLnRhYmxlKQpyZXF1aXJlKGdncGxvdDIpCnJlcXVpcmUocGxvdGx5KQpyZXF1aXJlKERUKQpyZXF1aXJlKGxtZXJUZXN0KQoKc291cmNlKCJzb3VyY2UvZnVuY3Rpb25zX21heTIwMTkuUiIpCgojIE9uIFdpbmRvd3Mgc2V0IG11bHRpdGhyZWFkPUZBTFNFLS0tLQptdCA8LSBUUlVFCmBgYAoKIyBJbnRyb2R1Y3Rpb24KQS9KIGluYnJlZCBtaWNlIGZyb20gdGhlIEphY2tzb24gTGFib3JhdG9yeSBhcmUgdXNlZCB0byBtb2RlbCBjYW5jZXIgYW5kIGZvciBjYXJjaW5vZ2VuIHRlc3RpbmcgZ2l2ZW4gdGhlaXIgaGlnaCBzdXNjZXB0aWJpbGl0eSB0byBjYXJjaW5vZ2VuLWluZHVjZWQgdHVtb3JzLiAgCiAgCkZyb20gW0NheW1hbiBDaGVtaWNhbF0oaHR0cHM6Ly93d3cuY2F5bWFuY2hlbS5jb20vcHJvZHVjdC8yMDg5NC9kaWFsbHlsLXN1bGZpZGUpOkRpYWxseWwgc3VsZmlkZSBpcyBhIHRoaW9ldGhlciBmb3VuZCBpbiBnYXJsaWMgdGhhdCBjYW4gbW9kdWxhdGUgdGhlIGN5dG9jaHJvbWUgUDQ1MCBkcnVnIG1ldGFib2xpemluZyBzeXN0ZW0sIGFjdGl2YXRlIHRoZSBjb25zdGl0dXRpdmUgYW5kcm9zdGFuZSByZWNlcHRvciB0byByZWd1bGF0ZSBtdWx0aWRydWcgcmVzaXN0YW5jZS1hc3NvY2lhdGVkIHByb3RlaW5zLCBhbmQgdXByZWd1bGF0ZSB0aGUgZXhwcmVzc2lvbiBvZiBkZXRveGlmeWluZyBlbnp5bWVzLiBHYXJsaWMtZGVyaXZlZCBvcmdhbm9zdWxmaWRlcyBzdWNoIGFzIGRpYWxseWwgc3VsZmlkZSBoYXZlIGJlZW4gc2hvd24gdG8gYmUgaGlnaGx5IHByb3RlY3RpdmUgZnJvbSBjaGVtaWNhbGx5LWluZHVjZWQgY2FyY2lub2dlbmVzaXMgaW4gYW5pbWFscy4gIAogIApOaWNvdGluZS1kZXJpdmVkIG5pdHJvc2FtaW5lIGtldG9uZSAoTk5LKSBpcyBvbmUgb2YgdGhlIGtleSB0b2JhY2NvLXNwZWNpZmljIG5pdHJvc2FtaW5lcyBkZXJpdmVkIGZyb20gbmljb3RpbmUuIEl0IHBsYXlzIGFuIGltcG9ydGFudCByb2xlIGluIGNhcmNpbm9nZW5lc2lzLiAgCiAgCk5pbmUgKDkpIEEvSiBtaWNlIHdlcmUgdXNlZCBpbiB0aGlzIHN0dWR5LCAzIGluIGVhY2ggb2YgdGhlIDMgdHJlYXRtZW50IGdyb3VwczogVmVoaWNsZSBjb250cm9sIChWQyksIE5OSyBjb250cm9sIGFuZCBOTksrREFTLiBUaGUgc3R1ZHkgZGVzaWduIGlzIGFzIGZvbGxvd3M6ICAKIVtdKGRvY3MvYWpfbWljZV9ubmtfc3R1ZHkgX2Rlc2lnbi5wbmcpICAKICAKREFTIGluIGNvcm4gb2lsIHdhcyBmb3JjZS1mZWQgdG8gbWljZSB0aHJvZ2hvdXQgdGhlIHN0dWR5ICh3ZWVrcyAwIHRvIDYpLiBBIHNpbmdsZSBkb3NlIG9mIDI0dU0vMC4xbUwgTk5LIHN1c3BlbmRlZCBpbiBnbHljZXJ5bCB0cmlvY3RhdGUgdmVoaWNsZSB3YXMgaW5qZWN0ZWQgYXQgV2VlayAxIGludHJhcGVyZXRvbmVhbGx5IChJUCkuIFRoZSB2ZWhpY3ZsZSBjb250cm9sIGdyb3VwIHJlY2VpdmVkIHZlaGljbGUgb25seS4gRmVjYWwgc2FtcGxlcyB3ZXJlIGNvbGxlY3RlZCBhdCA0IHRpbWVwb2ludHM6IGJlZm9yZSBEQVMgdHJlYXRtZW50IGJlZ2FuIChXZWVrIDApLCBhbmQgMSwgMiBhbmQgNCB3ZWVrcyBhZnRlciBwcmV0cmVhdG1lbnQgKFdlZWsgMSwgV2VlayAyIGFuZCBXZWVrIDQgcmVzcGVjdGl2ZWx5KS4gIAoKIyBEYXRhIHByZXByb2Nlc3NpbmcKIyMgUmF3IERhdGEgCkZhc3RRIGZpbGVzIHdlcmUgZG93bmxvYWRlZCBmcm9tIFtSdXRnZXJzIEJveF0oaHR0cHM6Ly9ydXRnZXJzLmFwcC5ib3guY29tL2ZvbGRlci85OTc1ODE2NTk4MikuIEEgdG90YWwgb2YgNzIgZmlsZXMgKDIgcGVyIHNhbXBsZSwgcGFpci1lbmRlZCkgd2VyZSBkb3dubG9hZGVkLiAKCiMjIFNjcmlwdApUaGlzIHNjcmlwdCAoKioqbnJmMnViaW9tZV9kYWRhMl9qYW4yMDIwX3YxLlJtZCoqKikgd2FzIGRldmVsb3BlZCB1c2luZyBbREFEQTIgUGlwZWxpbmUgVHV0b3JpYWwgKDEuMTIpXShodHRwczovL2JlbmpqbmViLmdpdGh1Yi5pby9kYWRhMi90dXRvcmlhbC5odG1sKSB3aXRoIHRpcHMgYW5kIHRyaWNrcyBmcm9tIHRoZSBbVW5pdmVyc2l0eSBvZiBNYXJ5bGFuZCBTaG9vbCBvZiBNZWRpY2luZSBJbnN0aXR1dGUgZm9yIEdlbm9tZSBTY2llbmNlcyAoSUdTKV0oaHR0cDovL3d3dy5pZ3MudW1hcnlsYW5kLmVkdS8pIFtNaWNyb2Jpb21lIEFuYWx5c2lzIFdvcmtzaG9wIChBcHJpbCA4LTExLCAyMDE5KV0oaHR0cDovL3d3dy5pZ3MudW1hcnlsYW5kLmVkdS9lZHVjYXRpb24vd2tzaHBfbWV0YWdlbm9tZS5waHApLiBUaGUgb3V0cHV0IG9mIHRoZSBEQURBMiBzY3JpcHQgKCoqKmRhdGFfamFuMjAyMC9wc19qYW4yMDIwLlJEYXRhKioqKSBpcyBleHBsb3JlZCBpbiB0aGlzIGRvY3VtZW50LgoKIyBNZXRhIGRhdGE6IHNhbXBsZSBkZXNjcmlwdGlvbgpgYGB7ciBkYXRhfQojIExvYWQgZGF0YS0tLS0KIyBDb3VudHMKbG9hZCgiZGF0YV9qYW4yMDIwL3BzX2phbjIwMjAuUkRhdGEiKQpwc19qYW4yMDIwQHNhbV9kYXRhCgojIFRheG9ub215CmxvYWQoImRhdGFfamFuMjAyMC90YXhhLlJEYXRhIikKdGF4YSA8LSBkYXRhLnRhYmxlKHNlcTE2cyA9IHJvd25hbWVzKHRheGEpLAogICAgICAgICAgICAgICAgICAgdGF4YSkKaGVhZCh0YXhhKQpgYGAKCkNPTlRJTlVFIEhFUkUhISEgMDIvMjkvMjAyMAoKIyBTYW1wbGVzCmBgYHtyIHNhbXBsZXN9CnBzX2phbjIwMjBAc2FtX2RhdGEkVHJlYXRtZW50IDwtIGZhY3Rvcihwc19qYW4yMDIwQHNhbV9kYXRhJFRyZWF0bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk5OSyBjb250cm9sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZlaGljbGUgY29udHJvbCAoVkMpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5OSytEQVMiKSkKcHNfamFuMjAyMEBzYW1fZGF0YSRJRCA8LSBmYWN0b3IocHNfamFuMjAyMEBzYW1fZGF0YSRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gdW5pcXVlKHBzX2phbjIwMjBAc2FtX2RhdGEkSUQpKQpwc19qYW4yMDIwQHNhbV9kYXRhJFdlZWsgPC0gZmFjdG9yKHBzX2phbjIwMjBAc2FtX2RhdGEkV2VlaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJXZWVrMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2VlazEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlZWsyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXZWVrNCIpKQpzYW1wbGVzIDwtIHBzX2phbjIwMjBAc2FtX2RhdGEKZGF0YXRhYmxlKHNhbXBsZXMsCiAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gbnJvdyhzYW1wbGVzKSkpCmBgYAoKIyBQcnVuZSBkYXRhClRoZSBPVFVzIHdlcmUgbWFwcGVkIHRvIEJhY3RlcmlhICg5OC40NSUpIGFuZCBFdWthcnlvdGEgKDEuMzAlKSBraW5nZG9tcywgYW5kICAxNiBPVFVzICgwLjI2JSkgdW5kZWZpbmVkLiAKCmBgYHtyIGNoZWNrX21hcHBpbmdfa2luZ2RvbSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KdDEgPC0gZGF0YS50YWJsZSh0YWJsZSh0YXhfdGFibGUocHNfamFuMjAyMClbLCAiS2luZ2RvbSJdLAogICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGUgPSBOVUxMKSkKdDEkVjFbaXMubmEodDEkVjEpXSA8LSAiVW5rbm93biIKCnQxWywgcGN0IDo9IE4vc3VtKE4pXQpzZXRvcmRlcih0MSwgLU4pCgpjb2xuYW1lcyh0MSkgPC0gYygiS2luZ2RvbSIsCiAgICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgT1RVcyIsCiAgICAgICAgICAgICAgICAgICJQZXJjZW50IG9mIE9UVXMiKQpkYXRhdGFibGUodDEsCiAgICAgICAgICByb3duYW1lcyA9IEZBTFNFLAogICAgICAgICAgY2FwdGlvbiA9ICJOdW1iZXIgb2YgT1RVcyBieSBLaW5nZG9tIiwKICAgICAgICAgIGNsYXNzID0gImNlbGwtYm9yZGVyIHN0cmlwZSIsCiAgICAgICAgICBvcHRpb25zID0gbGlzdChzZWFyY2ggPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VMZW5ndGggPSBucm93KHQxKSkpICU+JQogIGZvcm1hdEN1cnJlbmN5KGNvbHVtbnMgPSAyLAogICAgICAgICAgICAgICAgIGN1cnJlbmN5ID0gIiIsCiAgICAgICAgICAgICAgICAgbWFyayA9ICIsIiwKICAgICAgICAgICAgICAgICBkaWdpdHMgPSAwKSAlPiUKICBmb3JtYXRQZXJjZW50YWdlKGNvbHVtbnMgPSAzLAogICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMikKYGBgCgpUaGUgdG90YWwgb2YgNiwxNzQgdW5pcXVlIHNlcXVlbmNlcyB3ZXJlIGZvdW5kLiBPdXQgb2YgdGhvc2UsIDYsMDc4IHdlcmUgbWFwcGVkIHRvIGJhY3RlcmlhbCBnZW5vbWVzLiAKCmBgYHtyIGtlZXBfYmFjdGVyaWF9CmRpbShwc19qYW4yMDIwQG90dV90YWJsZUAuRGF0YSkKCiMgUmVtb3ZlIE9UVSBub3QgbWFwcGVkIHRvIEJhY3RlcmlhCnBzMCA8LSBzdWJzZXRfdGF4YShwc19qYW4yMDIwLCAKICAgICAgICAgICAgICAgICAgIEtpbmdkb20gPT0gIkJhY3RlcmlhIikKZGltKHBzMEBvdHVfdGFibGVALkRhdGEpCmBgYAogIApPdXQgb2YgdGhlIDYsMDc4IE9UVXMgNiwwNDQgYmVsb25nZWQgdG8gMTMgUGh5bHVtLiAzNCBvZiB0aGUgT1RVcyAob3IgMC41NiUgb2YgYmFjdGVyaWFsIE9UVXMpIGNvdWxkIG5vdCBiZSBtYXBwZWQgdG8gYSBwaHlsdW0uCgpgYGB7ciBwaHlsdW1fbWFwcGluZ30KdDIgPC0gZGF0YS50YWJsZSh0YWJsZSh0YXhfdGFibGUocHMwKVssICJQaHlsdW0iXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGUgPSBOVUxMKSkKdDIkVjFbaXMubmEodDIkVjEpXSA8LSAiVW5rbm93biIKc2V0b3JkZXIodDIsIC1OKQp0MlssIHBjdCA6PSBOL3N1bShOKV0Kc2V0b3JkZXIodDIsIC1OKQoKY29sbmFtZXModDIpIDwtIGMoIlBoeWx1bSIsCiAgICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgT1RVcyIsCiAgICAgICAgICAgICAgICAgICJQZXJjZW50IG9mIE9UVXMiKQoKZGF0YXRhYmxlKHQyLAogICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSwKICAgICAgICAgIGNhcHRpb24gPSAiTnVtYmVyIG9mIEJhY3RlcmlhbCBPVFVzIGJ5IFBoeWx1bSIsCiAgICAgICAgICBjbGFzcyA9ICJjZWxsLWJvcmRlciBzdHJpcGUiLAogICAgICAgICAgb3B0aW9ucyA9IGxpc3Qoc2VhcmNoID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gbnJvdyh0MikpKSAlPiUKICBmb3JtYXRDdXJyZW5jeShjb2x1bW5zID0gMiwKICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9ICIiLAogICAgICAgICAgICAgICAgIG1hcmsgPSAiLCIsCiAgICAgICAgICAgICAgICAgZGlnaXRzID0gMCkgJT4lCiAgZm9ybWF0UGVyY2VudGFnZShjb2x1bW5zID0gMywKICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDIpCmBgYAoKIyBPVFUgdGFibGUgKGZpcnN0IDEwIHJvd3MpCmBgYHtyIG90dV90YWJsZSwgd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0V9Cm90dSA8LSBkYXRhLnRhYmxlKHBzMEB0YXhfdGFibGVALkRhdGEsCiAgICAgICAgICAgICAgICAgIHQocHMwQG90dV90YWJsZUAuRGF0YSkpCmRhdGF0YWJsZShoZWFkKG90dSwgMTApLAogICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSwKICAgICAgICAgIGNhcHRpb24gPSAiVGF4b25vbWljICBjb3VudCB0YWJsZSIsCiAgICAgICAgICBjbGFzcyA9ICJjZWxsLWJvcmRlciBzdHJpcGUiLAogICAgICAgICAgb3B0aW9ucyA9IGxpc3Qoc2VhcmNoID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gMTApKSAlPiUKICBmb3JtYXRDdXJyZW5jeShjb2x1bW5zID0gNzozNiwKICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9ICIiLAogICAgICAgICAgICAgICAgIG1hcmsgPSAiLCIsCiAgICAgICAgICAgICAgICAgZGlnaXRzID0gMCkKYGBgCgojIFRvdGFsIGNvdW50cyBwZXIgc2FtcGxlIChpLmUuIHNlcXVlbmNpbmcgZGVwdGgpCmBgYHtyIHNlcV9kZXB0aCwgZmlnLndpZHRoID0gMTAsZmlnLmhlaWdodCA9IDV9CnQxIDwtIGNvbFN1bXMob3R1WywgNzpuY29sKG90dSldKQp0MSA8LSBkYXRhLnRhYmxlKFNBTVBMRV9OQU1FID0gbmFtZXModDEpLAogICAgICAgICAgICAgICAgIFRvdGFsID0gdDEpCgp0MiA8LSBkYXRhLnRhYmxlKFNBTVBMRV9OQU1FID0gcm93bmFtZXMoc2FtcGxlcyksCiAgICAgICAgICAgICAgICAgSUQgPSBzYW1wbGVzJElELAogICAgICAgICAgICAgICAgIFRSRUFUTUVOVCA9IHNhbXBsZXMkVHJlYXRtZW50LAogICAgICAgICAgICAgICAgIFdFRUsgPSBzYW1wbGVzJFdlZWspCgpzbXBsIDwtIG1lcmdlKHQxLAogICAgICAgICAgICAgIHQyLAogICAgICAgICAgICAgIGJ5ID0gIlNBTVBMRV9OQU1FIikKCnAxIDwtIGdncGxvdChzbXBsLAogICAgICAgICAgICAgYWVzKHggPSBTQU1QTEVfTkFNRSwKICAgICAgICAgICAgICAgICB5ID0gVG90YWwsCiAgICAgICAgICAgICAgICAgZmlsbCA9IFRSRUFUTUVOVCwKICAgICAgICAgICAgICAgICBjb2xvdXIgPSBXRUVLKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZSgiIikgKwogIHNjYWxlX3lfY29udGludW91cygiTnVtYmVyIG9mIFJlYWRzIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUoIlRyZWF0bWVudCIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSkpIApnZ3Bsb3RseShwMSkKYGBgCgojIFJpY2huZXNzIChBbHBoYSBkaXZlcnNpdHkpClNoYW5ub24gaW5kZXggKGFrYSBTaGFubm9uIGVudGhyb3BoeSkgaXMgY2FsY3VsYXRlZCBhczogIApIJyA9IC1zdW0oMSB0byBSKXAoaSlsbihwKGkpKSAKV2hlbiB0aGVyZSBpcyBleGFjdGx5IDEgdHlwZSBvZiBkYXRhIChlLmcuIGEgc2luZ2xlIHNwZWNpZXMgaW4gdGhlIHNhbXBsZSksIEgnPTAuIFRoZSBvcHBvc2l0ZSBzY2VuYXJpbyBpcyB3aGVuIHRoZXJlIGFyZSBSPjEgc3BlY2llcyBwcmVzZW50IGluIHRoZSBzYW1wbGUgaW4gdGhlIGV4YWN0IHNhbWUgYW1vdW50cyBhbmQgSCc9bG4oUikuICAKICAKU2hhbm5vbidzIGRpdmVyc2l0eSBpbmRleCB3YXMgY2FsY3VsYXRlZCBmb3IgZWFjaCBzYW1wbGUgYW5kIHBsb3RlZCBvdmVyIHRpbWUgdXNpbmcgdGhlIDcsNzY0IGZyb20gdGhlIDEzIFBoeWx1bSBhYm92ZS4KICAKYGBge3Igc2hhbm5vbl92c19kZXB0aCwgZmlnLmhlaWdodCA9IDUsIGZpZy53aWR0aCA9IDZ9CnNoYW5ub24ubmR4IDwtIGVzdGltYXRlX3JpY2huZXNzKHBzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZXMgPSAiU2hhbm5vbiIpCgpzaGFubm9uLm5keCA8LSBkYXRhLnRhYmxlKFNBTVBMRV9OQU1FID0gcm93bmFtZXMoc2hhbm5vbi5uZHgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNoYW5ub24ubmR4KQoKc21wbCA8LSBtZXJnZShzbXBsLAogICAgICAgICAgICAgIHNoYW5ub24ubmR4LAogICAgICAgICAgICAgIGJ5ID0gIlNBTVBMRV9OQU1FIikKCnAxIDwtIGdncGxvdChzbXBsLAogICAgICAgICAgICAgYWVzKHggPSBUb3RhbCwKICAgICAgICAgICAgICAgICB5ID0gU2hhbm5vbiwKICAgICAgICAgICAgICAgICAjIHNoYXBlID0gV0VFSywKICAgICAgICAgICAgICAgICBmaWxsID0gV0VFSykpICsKICBnZW9tX3BvaW50KHNpemUgPSAyLAogICAgICAgICAgICAgc2hhcGUgPSAyMSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKGJyZWFrcyA9IHVuaXF1ZShzbXBsJFdFRUspLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyZWVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibHVlIikpCiAgIyBzY2FsZV9zaGFwZV9tYW51YWwoYnJlYWtzID0gdW5pcXVlKHNtcGwkV0VFSyksCiAgIyAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gMjE6MjQpCgp0aWZmKGZpbGVuYW1lID0gInRtcC9zaGFubm9uX3ZzX2RlcHRoLnRpZmYiLAogICAgIGhlaWdodCA9IDUsCiAgICAgd2lkdGggPSA2LAogICAgIHVuaXRzID0gImluIiwKICAgICByZXMgPSA2MDAsCiAgICAgY29tcHJlc3Npb24gPSAibHp3K3AiKQpwcmludChwMSkKZ3JhcGhpY3Mub2ZmKCkKCmdncGxvdGx5KHAxKQpgYGAKCkV2ZW4gdGhvdWdoICoqKmVzdGltYXRlX3JpY2huZXNzKioqIGZ1bmN0aW9uIGRvZXMgbm90IGFkanVzdCBmb3IgdGhlIHNlcXVlbmNpbmcgZGVwdGgsIHRoZXJlIGlzIG5vIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIGluZGV4IGFuZCB0aGUgc2FtcGxlJ3Mgc2VxdWVjaW5nIGRlcHRoLiBQcm9jZWVkIHdpdGggdGhlIGNvbXBhcmlzb24uCgojIFNoYW5ub24gaWRleCBvdmVyIHRpbWUKYGBge3IgcmljaG5lc3MsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSA1fQpwMSA8LSBwbG90X3JpY2huZXNzKHBzMCwKICAgICAgICAgICAgICAgICAgICB4ID0gIldlZWsiLCAKICAgICAgICAgICAgICAgICAgICBtZWFzdXJlcyA9ICJTaGFubm9uIikgKwogIGZhY2V0X3dyYXAofiBUcmVhdG1lbnQpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gSUQpLAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gVHJlYXRtZW50KSwKICAgICAgICAgICAgIHNoYXBlID0gMjEsCiAgICAgICAgICAgICBzaXplID0gMywKICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX3hfZGlzY3JldGUoIiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDEpKQoKZ2dwbG90bHkocCA9IHAxLAogICAgICAgICB0b29sdGlwID0gYygiSUQiLAogICAgICAgICAgICAgICAgICAgICAidmFsdWUiKSkKCnAxIDwtIHAxICsgCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZSgiIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQoKdGlmZihmaWxlbmFtZSA9ICJ0bXAvc2hhbm5vbi50aWZmIiwKICAgICBoZWlnaHQgPSA0LAogICAgIHdpZHRoID0gNSwKICAgICB1bml0cyA9ICJpbiIsCiAgICAgcmVzID0gNjAwLAogICAgIGNvbXByZXNzaW9uID0gImx6dytwIikKcHJpbnQocDEpCmdyYXBoaWNzLm9mZigpCmBgYAoKVGhlIHBsb3QgYWJvdmUgc3VnZ2VzdHMgdGhhdCB0aGUgbGFyZ2VzdCBkaWZmZXJlbmNlcyBpbiBhbHBoYSBkaXZlcnNpdHkgKGFzIG1lYXN1cmVkIGJ5IFNoYW5ub24ncyBpbmRleCkgYXJlIGluIGdlbm90eXBlLgogIApUZXN0IGlmIHRoZSByaWNobmVzcyBjaGFuZ2VkIGJldHdlZW4gdGhlIGJhc2VsaW5lIGFuZCBXZWVrIDguICAKICAKYGBge3IgbG1fcmljaG5lc3N9CnNtcGwkVFJFQVRNRU5UIDwtIGZhY3RvcihzbXBsJFRSRUFUTUVOVCwKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkRTUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYWl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEU1MrUEVJVEMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRFNTK0NyYW5iZXJyeSIpKQoKdG1wIDwtIGRyb3BsZXZlbHMoc21wbFtXRUVLICE9ICJ3ZWVrMSJdKQoKbTEgPC0gbG0oU2hhbm5vbiAgfiBXRUVLKihUUkVBVE1FTlQgKyBHZW5vdHlwZSksCiAgICAgICAgICMgb2Zmc2V0ID0gVG90YWwsCiAgICAgICAgIGRhdGEgPSB0bXApCnN1bW1hcnkobTEpCmBgYAogIApgYGB7ciBsbWVyX3JpY2huZXNzfQptMiA8LSBsbWVyKFNoYW5ub24gIH4gV0VFSyooVFJFQVRNRU5UICsgR2Vub3R5cGUpICsgKDEgfCBJRCksCiAgICAgICAgICAgIyBvZmZzZXQgPSBUb3RhbCwKICAgICAgICAgICBkYXRhID0gdG1wKQpzdW1tYXJ5KG0yKQpgYGAKCiMgQ2FsY3VsYXRlIGNoYW5nZSBpbiBTaGFubm9uIGluZGV4IGZyb20gYmFzZWxpbmUKYGBge3IgZGVsdGFfc2hhbm5vbiwgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDV9CmRkIDwtIHNtcGwKZGRbLCBkZWx0YSA6PSBTaGFubm9uIC0gU2hhbm5vbltXRUVLID09ICJiYXNlbGluZSJdLAogICBieSA9IElEXQpkZCRkaWZmIDwtIHBhc3RlKGRkJFdFRUssCiAgICAgICAgICAgICAgICAgIi1iYXNlbGluZSIsCiAgICAgICAgICAgICAgICAgc2VwID0gIiIpCgpkZCA8LSBkZFtXRUVLICE9ICJiYXNlbGluZSIsXQoKcDEgPC0gZ2dwbG90KGRkLAogICAgICAgICAgICAgYWVzKHggPSBUUkVBVE1FTlQsCiAgICAgICAgICAgICAgICAgeSA9IGRlbHRhLAogICAgICAgICAgICAgICAgIGZpbGwgPSBHZW5vdHlwZSkpICsKICBmYWNldF93cmFwKH4gZGlmZikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuMyksCiAgICAgICAgICAgICBzaGFwZSA9IDIxLAogICAgICAgICAgICAgc2l6ZSA9IDMpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoIlNoYW5ub24gSW5kZXggUGVyY2VudCBDaGFuZ2UgZnJvbSBCYXNlbGluZSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSkpCnByaW50KHAxKQoKZGQxJFRSRUFUTUVOVCA8LSBmYWN0b3IoZGQxJFRSRUFUTUVOVCwKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiRFNTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEU1MrUEVJVEMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEU1MrQ3JhbmJlcnJ5IikpCmRkMSRHZW5vdHlwZSA8LSBmYWN0b3IoZGQxJEdlbm90eXBlLAogICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndpZGV0eXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJucmYyS08iKSkKCm0xIDwtIGxtKGRlbHRhIH4gVFJFQVRNRU5UKkdlbm90eXBlLAogICAgICAgICBkYXRhID0gZGQxKQpzdW1tYXJ5KG0xKQoKIyBObyBzaWduaWZpY2FudCBpbnRlcmFjdGlvbnMsIHByb2NlZWQgd2l0aCAyLXdheSBhbmFseXNpcwptMiA8LSBsbShkZWx0YSB+IFRSRUFUTUVOVCArIEdlbm90eXBlLAogICAgICAgICBkYXRhID0gZGQxKQpzdW1tYXJ5KG0yKQpgYGAKCkF0IFdlZWsgOCB0aGVyZSB3YXMgc2lnbmlmaWNhbnRseSBzbWFsbGVyIGluY3JlYXNlIG9mIGFscGhhIGRpdmVyc2l0eSBmcm9tIGJhc2VsaW5lIGluIE5yZjIgS08gY29tcGFyZWQgdG8gV1QsIGFuZCBpbiBEU1MrQ3JhbmJlcnJ5IGNvbXBhcmVkIHRvIERTUyBvbmx5LgoKIyBMb2FkIGFtaW5vYWNpZHMKYGBge3IgYW1pbm9hY2lkc30KYWEgPC0gZnJlYWQoImRhdGFfamFuMjAyMC9qYW4yMDIwX2FtaW5vYWNpZHMuY3N2IikKYGBgCgoKCkNPTlRJTlVFIEhFUkUhICgyLzExLzIwMjApCgpUaGUgcmVzdWx0cyBzaG93ZWQgdGhhdC4uLgoKCgoKCgoKIyBSZW1vdmUgdW5tYXBwZWQgT1RVcwpUaGUgMzExIHVubWFwcGVkIE9UVXMgd2VyZSByZW1vdmVkIGZyb20gZnVydGhlciBhbmFseXNpcyAod2l0aCA3LDI0NyBPVFVzIGxlZnQpLgpgYGB7ciByZW1vdmVfdW5tYXBwZWRfb3R1X3BoeWx1bX0KcHMxIDwtIHN1YnNldF90YXhhKHBzMCwgCiAgICAgICAgICAgICAgICAgICAhaXMubmEoUGh5bHVtKSkKZGltKHBzMUBvdHVfdGFibGVALkRhdGEpCmBgYAoKIyBDb3VudHMgYXQgUGh5bHVtIGxldmVsCmBgYHtyIGNvdW50c19wLCB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRX0KY291bnRzX3AgPC0gY291bnRzX2J5X3RheF9yYW5rKGR0MSA9IG90dSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZ3JfYnkgPSAiUGh5bHVtIikKc2V0b3JkZXIoY291bnRzX3AsIC1gMTkwOTE5LTAxYCkKZGF0YXRhYmxlKGNvdW50c19wLAogICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSwKICAgICAgICAgIGNhcHRpb24gPSAiVGF4b25vbWljICBjb3VudCB0YWJsZSIsCiAgICAgICAgICBjbGFzcyA9ICJjZWxsLWJvcmRlciBzdHJpcGUiLAogICAgICAgICAgb3B0aW9ucyA9IGxpc3Qoc2VhcmNoID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gbnJvdyhjb3VudHNfcCkpKSAlPiUKICBmb3JtYXRDdXJyZW5jeShjb2x1bW5zID0gMjpuY29sKGNvdW50c19wKSwKICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9ICIiLAogICAgICAgICAgICAgICAgIG1hcmsgPSAiLCIsCiAgICAgICAgICAgICAgICAgZGlnaXRzID0gMCkKYGBgCgojIFJlbGF0aXZlIGFidW5kYW5jZSAoJSkgYXQgUGh5bHVtIGxldmVsCmBgYHtyIHJhX3AsIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFfQpyYV9wIDwtIHJhX2J5X3RheF9yYW5rKGNvdW50cyA9IGNvdW50c19wLAogICAgICAgICAgICAgICAgICAgICAgIHBjdCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0ID0gNCkKCmRhdGF0YWJsZShyYV9wLAogICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSwKICAgICAgICAgIGNhcHRpb24gPSAiVGF4b25vbWljICBjb3VudCB0YWJsZSIsCiAgICAgICAgICBjbGFzcyA9ICJjZWxsLWJvcmRlciBzdHJpcGUiLAogICAgICAgICAgb3B0aW9ucyA9IGxpc3Qoc2VhcmNoID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gbnJvdyhyYV9wKSkpICU+JQogIGZvcm1hdFBlcmNlbnRhZ2UoY29sdW1ucyA9IDI6bmNvbChjb3VudHNfcCksCiAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKQpgYGAKClJlbW92ZSBwaHlsYSB3aXRoIHJlbGF0aXZlIGFidW5kYW5jZSBvZiA+PSAxJSBpbiBsZXNzIHRoYW4gMTAlIG9mIHNhbXBsZXMuCgpgYGB7ciBwcmV2X3B9CnQxIDwtIGRhdGEudGFibGUoUGh5bHVtID0gcmFfcCRQaHlsdW0sCiAgICAgICAgICAgICAgICAgYE51bWJlciBvZiBTYW1wbGVzYCA9IHJvd1N1bXMocmFfcFssIDI6bmNvbChyYV9wKV0gPj0gMC4wMSkpCnQxJGBQZXJjZW50IFNhbXBsZXNgIDwtICB0MSRgTnVtYmVyIG9mIFNhbXBsZXNgLzcyCgpzZXRvcmRlcih0MSwgLWBOdW1iZXIgb2YgU2FtcGxlc2ApCmRhdGF0YWJsZSh0MSwKICAgICAgICAgIHJvd25hbWVzID0gRkFMU0UsCiAgICAgICAgICBjYXB0aW9uID0gIlRheG9ub21pYyAgY291bnQgdGFibGUiLAogICAgICAgICAgY2xhc3MgPSAiY2VsbC1ib3JkZXIgc3RyaXBlIiwKICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHNlYXJjaCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUxlbmd0aCA9IG5yb3codDEpKSkgJT4lCiAgZm9ybWF0UGVyY2VudGFnZShjb2x1bW5zID0gMywKICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDEpCmBgYAoKV2Ugd2lsbCByZW1vdmUgQ2hsYW15ZGlhZSBmcm9tIHRoaXMgYW5hbHlzaXMuCgpgYGB7ciBrZWVwXzZfcGh5bGEsIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFfQprZWVwX3AgPC0gdDEkUGh5bHVtW3QxJGBQZXJjZW50IFNhbXBsZXNgID49IDAuMV0KIyAjIEtlZXAgYWxsCiMga2VlcF9wIDwtIHQxJFBoeWx1bQoKcGFzdGUwKGtlZXBfcCwgY29sbGFwc2UgPSAiLCAiKQoKcHMxIDwtIHN1YnNldF90YXhhKHBzMCwgCiAgICAgICAgICAgICAgICAgICBQaHlsdW0gJWluJSBrZWVwX3AgKQpvdHUxIDwtIGRhdGEudGFibGUocHMxQHRheF90YWJsZUAuRGF0YSwKICAgICAgICAgICAgICAgICAgIHQocHMxQG90dV90YWJsZUAuRGF0YSkpCgpkYXRhdGFibGUoaGVhZChvdHUxLCAxMCksCiAgICAgICAgICByb3duYW1lcyA9IEZBTFNFLAogICAgICAgICAgY2FwdGlvbiA9ICJUYXhvbm9taWMgIGNvdW50IHRhYmxlIiwKICAgICAgICAgIGNsYXNzID0gImNlbGwtYm9yZGVyIHN0cmlwZSIsCiAgICAgICAgICBvcHRpb25zID0gbGlzdChzZWFyY2ggPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VMZW5ndGggPSAxMCkpICU+JQogIGZvcm1hdEN1cnJlbmN5KGNvbHVtbnMgPSA3Om5jb2wob3R1MSksCiAgICAgICAgICAgICAgICAgY3VycmVuY3kgPSAiIiwKICAgICAgICAgICAgICAgICBtYXJrID0gIiwiLAogICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDApCmBgYAoKWFggT1RVcywgZG93biBmcm9tIFlZIE9UVXMgaW4gdGhlIHByZXZpb3VzIHRhYmxlLgoKCiMgUmVsYXRpdmUgQWJ1bmRhbmNlIGluIFNhbXBsZXMgYXQgRGlmZmVyZW50IFRheG9ub21pYyBSYW5rcwojIyAxLiBDbGFzcwpgYGB7ciBjb3VudHNfYywgd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0UsZmlnLndpZHRoPTE1LGZpZy5oZWlnaHQ9MTV9CmNvdW50c19jIDwtIGNvdW50c19ieV90YXhfcmFuayhkdDEgPSBvdHUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncl9ieSA9ICJDbGFzcyIpCnJhX2MgPC0gcmFfYnlfdGF4X3JhbmsoY291bnRzX2MpCgp0YXgucmFua3MgPC0gdW5pcXVlKG90dTFbLCBjKCJQaHlsdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGFzcyIpXSkKCnJhX2MgPC0gbWVyZ2UodGF4LnJhbmtzLAogICAgICAgICAgICAgIHJhX2MsCiAgICAgICAgICAgICAgYnkgPSAiQ2xhc3MiKQoKdG90YWwgPC0gcm93U3VtcyhyYV9jWywgMzpuY29sKHJhX2MpXSkKCnJhX2MkQ2xhc3MgPC0gZmFjdG9yKHJhX2MkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHJhX2MkQ2xhc3Nbb3JkZXIodG90YWwpXSkKCnJhX2MkUGh5bHVtIDwtIGZhY3RvcihyYV9jJFBoeWx1bSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHVuaXF1ZShyYV9jJFBoeWx1bVtvcmRlcih0b3RhbCldKSkKdG1wIDwtIG1lbHQuZGF0YS50YWJsZShkYXRhID0gcmFfYywKICAgICAgICAgICAgICAgICAgICAgICBpZC52YXJzID0gMToyLAogICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmUudmFycyA9IDM6bmNvbChjb3VudHNfYyksCiAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZSA9ICJTQU1QTEVfTkFNRSIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICJSQSIpCgp0bXAgPC0gbWVyZ2UoZGF0YS50YWJsZShTQU1QTEVfTkFNRSA9IHNtcGwkU0FNUExFX05BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgIFdFRUsgPSBzbXBsJFdFRUssCiAgICAgICAgICAgICAgICAgICAgICAgIFRSRUFUTUVOVCA9IHNtcGwkVFJFQVRNRU5ULAogICAgICAgICAgICAgICAgICAgICAgICBHZW5vdHlwZSA9IHNtcGwkR2Vub3R5cGUpLAogICAgICAgICAgICAgdG1wLAogICAgICAgICAgICAgYnkgPSAiU0FNUExFX05BTUUiKQoKIyBQbG90IHNhbXBsZXMKcDEgPC0gZ2dwbG90KHRtcCwKICAgICAgICAgICAgIGFlcyh4ID0gU0FNUExFX05BTUUsCiAgICAgICAgICAgICAgICAgeSA9IFJBLAogICAgICAgICAgICAgICAgIGZpbGwgPSBDbGFzcywKICAgICAgICAgICAgICAgICBjb2xvciA9IFBoeWx1bSkpICsKICBmYWNldF93cmFwKH4gV0VFSyArIFRSRUFUTUVOVCArIEdlbm90eXBlLAogICAgICAgICAgICAgc2NhbGVzID0gImZyZWVfeCIsCiAgICAgICAgICAgICBucm93ID0gMykgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZSgiIikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSkpCmdncGxvdGx5KHAxKQpgYGAKCmBgYHtyIG1lYW5zX2MsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CmxyYSA8LSByYV9tZWx0KHJhID0gcmFfYywKICAgICAgICAgICAgICAgc2FtcGxlcyA9IHNtcGwsCiAgICAgICAgICAgICAgIHNhbXBsZV9uYW1lID0gIlNBTVBMRV9OQU1FIikKCm11IDwtIGRhdGEudGFibGUoYWdncmVnYXRlKGxyYSRSQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBsaXN0KFdlZWsgPSBscmEkV0VFSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWF0bWVudCA9IGxyYSRUUkVBVE1FTlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5vdHlwZSA9IGxyYSRHZW5vdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzID0gbHJhJENsYXNzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOID0gIm1lYW4iKSkKbXVbLCB0b3RhbCA6PSBzdW0oeCksCiAgIGJ5ID0gIkNsYXNzIl0KdWwgPC0gdW5pcXVlKG11WywgYygiQ2xhc3MiLCAKICAgICAgICAgICAgICAgICAgICAidG90YWwiKV0pCnVsIDwtIHVsW29yZGVyKHRvdGFsKSxdCm11JENsYXNzIDwtIGZhY3RvcihtdSRDbGFzcywKICAgICAgICAgICAgICAgICAgIGxldmVsID0gdWwkQ2xhc3MpCm11JHRvdGFsIDwtIE5VTEwKCmRhdGF0YWJsZShtdSwKICAgICAgICAgIHJvd25hbWVzID0gRkFMU0UsCiAgICAgICAgICBjYXB0aW9uID0gIlRheG9ub21pYyAgY291bnQgdGFibGUiLAogICAgICAgICAgY2xhc3MgPSAiY2VsbC1ib3JkZXIgc3RyaXBlIiwKICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHNlYXJjaCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUxlbmd0aCA9IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIgPSBsaXN0KGxpc3QoMywgJ2Rlc2MnKSkpKSAlPiUKICBmb3JtYXRDdXJyZW5jeShjb2x1bW5zID0gNSwKICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9ICIiLAogICAgICAgICAgICAgICAgIG1hcmsgPSAiLCIsCiAgICAgICAgICAgICAgICAgZGlnaXRzID0gMikKYGBgCgoKYGBge3IgbWVhbnNfY19wMCwgZmlnLndpZHRoID0gOSwgZmlnLmhlaWdodCA9IDd9Cm11JFRydF9HZW5vdHlwZSA8LSBmYWN0b3IocGFzdGUobXUkVHJlYXRtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgIG11JEdlbm90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICJfIikpCgpwMCA8LSBnZ3Bsb3QobXUsCiAgICAgICAgICAgICBhZXMoeCA9IFdlZWssCiAgICAgICAgICAgICAgICAgeSA9IHgsCiAgICAgICAgICAgICAgICAgZ3JvdXAgPSBUcnRfR2Vub3R5cGUpKSArCiAgZmFjZXRfd3JhcCh+IENsYXNzLAogICAgICAgICAgICAgc2NhbGUgPSAiZnJlZV95IikgKwogIGdlb21fbGluZShwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuMykpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gVHJ0X0dlbm90eXBlKSwKICAgICAgICAgICAgIHNoYXBlID0gMjEsCiAgICAgICAgICAgICBzaXplID0gMiwKICAgICAgICAgICAgIGFscGhhID0gMC41LAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjMpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZSgiIikgKwogIHNjYWxlX3lfY29udGludW91cygiUmVsYXRpdmUgQWJ1bmRhbmNlICglKSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSkpCgp0aWZmKGZpbGVuYW1lID0gInRtcC93dF9jbGFzc19vdmVyX3RpbWUudGlmZiIsCiAgICAgaGVpZ2h0ID0gNSwKICAgICB3aWR0aCA9IDcsCiAgICAgdW5pdHMgPSAiaW4iLAogICAgIHJlcyA9IDYwMCwKICAgICBjb21wcmVzc2lvbiA9ICJsencrcCIpCnByaW50KHAwKQpncmFwaGljcy5vZmYoKQoKcHJpbnQocDApCmBgYAoKCmBgYHtyIG1lYW5zX2NfcDEsIGZpZy5oZWlnaHQgPSA1LCBmaWcud2lkdGggPSA5fQpwMSA8LSBnZ3Bsb3QobXUsCiAgICAgICAgICAgICBhZXMoeCA9IHgsCiAgICAgICAgICAgICAgICAgeSA9IENsYXNzLAogICAgICAgICAgICAgICAgIGNvbG9yID0gVHJ0X0dlbm90eXBlLAogICAgICAgICAgICAgICAgIHNoYXBlID0gV2VlaykpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLAogICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxLAogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX3hfY29udGludW91cygiUmVsYXRpdmUgQWJ1bmRhbmNlICglKSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKCnRpZmYoZmlsZW5hbWUgPSAidG1wL3d0X2NsYXNzX3JhLnRpZmYiLAogICAgIGhlaWdodCA9IDQsCiAgICAgd2lkdGggPSA3LAogICAgIHVuaXRzID0gImluIiwKICAgICByZXMgPSA2MDAsCiAgICAgY29tcHJlc3Npb24gPSAibHp3K3AiKQpwcmludChwMSkKZ3JhcGhpY3Mub2ZmKCkKCmdncGxvdGx5KHAxKQpgYGAKCiMjIDIuIE9yZGVyCmBgYHtyIGNvdW50c19vLCB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSxmaWcud2lkdGg9MTUsZmlnLmhlaWdodD0xNX0KY291bnRzX28gPC0gY291bnRzX2J5X3RheF9yYW5rKGR0MSA9IG90dTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyX2J5ID0gIk9yZGVyIikKcmFfbyA8LSByYV9ieV90YXhfcmFuayhjb3VudHNfbykKCnRheC5yYW5rcyA8LSB1bmlxdWUob3R1MVssIGMoIlBoeWx1bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yZGVyIildKQoKcmFfbyA8LSBtZXJnZSh0YXgucmFua3MsCiAgICAgICAgICAgICAgcmFfbywKICAgICAgICAgICAgICBieSA9ICJPcmRlciIpCgp0b3RhbCA8LSByb3dTdW1zKHJhX29bLCAzOm5jb2wocmFfbyldKQoKcmFfbyRPcmRlciA8LSBmYWN0b3IocmFfbyRPcmRlciwKICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gcmFfbyRPcmRlcltvcmRlcih0b3RhbCldKQoKcmFfbyRQaHlsdW0gPC0gZmFjdG9yKHJhX28kUGh5bHVtLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gdW5pcXVlKHJhX28kUGh5bHVtW29yZGVyKHRvdGFsKV0pKQp0bXAgPC0gbWVsdC5kYXRhLnRhYmxlKGRhdGEgPSByYV9vLAogICAgICAgICAgICAgICAgICAgICAgIGlkLnZhcnMgPSAxOjIsCiAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZS52YXJzID0gMzpuY29sKGNvdW50c19vKSwKICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lID0gIlNBTVBMRV9OQU1FIiwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gIlJBIikKCnRtcCA8LSBtZXJnZShkYXRhLnRhYmxlKFNBTVBMRV9OQU1FID0gc21wbCRTQU1QTEVfTkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgV0VFSyA9IHNtcGwkV0VFSywKICAgICAgICAgICAgICAgICAgICAgICAgVFJFQVRNRU5UID0gc21wbCRUUkVBVE1FTlQsCiAgICAgICAgICAgICAgICAgICAgICAgIEdlbm90eXBlID0gc21wbCRHZW5vdHlwZSksCiAgICAgICAgICAgICB0bXAsCiAgICAgICAgICAgICBieSA9ICJTQU1QTEVfTkFNRSIpCgojIFBsb3Qgc2FtcGxlcwpwMSA8LSBnZ3Bsb3QodG1wLAogICAgICAgICAgICAgYWVzKHggPSBTQU1QTEVfTkFNRSwKICAgICAgICAgICAgICAgICB5ID0gUkEsCiAgICAgICAgICAgICAgICAgZmlsbCA9IE9yZGVyLAogICAgICAgICAgICAgICAgIGNvbG9yID0gUGh5bHVtKSkgKwogIGZhY2V0X3dyYXAofiBXRUVLICsgVFJFQVRNRU5UICsgR2Vub3R5cGUsCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZV94IiwKICAgICAgICAgICAgIG5yb3cgPSAzKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBzY2FsZV94X2Rpc2NyZXRlKCIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxKSkKZ2dwbG90bHkocDEpCmBgYAoKYGBge3IgbWVhbnNfbywgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KbHJhIDwtIHJhX21lbHQocmEgPSByYV9vLAogICAgICAgICAgICAgICBzYW1wbGVzID0gc21wbCwKICAgICAgICAgICAgICAgc2FtcGxlX25hbWUgPSAiU0FNUExFX05BTUUiKQoKbXUgPC0gZGF0YS50YWJsZShhZ2dyZWdhdGUobHJhJFJBLAogICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGxpc3QoV2VlayA9IGxyYSRXRUVLLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlYXRtZW50ID0gbHJhJFRSRUFUTUVOVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbm90eXBlID0gbHJhJEdlbm90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JkZXIgPSBscmEkT3JkZXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBGVU4gPSAibWVhbiIpKQptdVssIHRvdGFsIDo9IHN1bSh4KSwKICAgYnkgPSAiT3JkZXIiXQp1bCA8LSB1bmlxdWUobXVbLCBjKCJPcmRlciIsIAogICAgICAgICAgICAgICAgICAgICJ0b3RhbCIpXSkKdWwgPC0gdWxbb3JkZXIodG90YWwpLF0KbXUkT3JkZXIgPC0gZmFjdG9yKG11JE9yZGVyLAogICAgICAgICAgICAgICAgICAgbGV2ZWwgPSB1bCRPcmRlcikKbXUkdG90YWwgPC0gTlVMTAoKZGF0YXRhYmxlKG11LAogICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSwKICAgICAgICAgIGNhcHRpb24gPSAiVGF4b25vbWljICBjb3VudCB0YWJsZSIsCiAgICAgICAgICBjbGFzcyA9ICJjZWxsLWJvcmRlciBzdHJpcGUiLAogICAgICAgICAgb3B0aW9ucyA9IGxpc3Qoc2VhcmNoID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlciA9IGxpc3QobGlzdCgzLCAnZGVzYycpKSkpICU+JQogIGZvcm1hdEN1cnJlbmN5KGNvbHVtbnMgPSA1LAogICAgICAgICAgICAgICAgIGN1cnJlbmN5ID0gIiIsCiAgICAgICAgICAgICAgICAgbWFyayA9ICIsIiwKICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKQpgYGAKCmBgYHtyIG1lYW5zX29fcDAsIGZpZy53aWR0aCA9IDksIGZpZy5oZWlnaHQgPSA3fQptdSRUcnRfR2Vub3R5cGUgPC0gZmFjdG9yKHBhc3RlKG11JFRyZWF0bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdSRHZW5vdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiXyIpKQoKcDAgPC0gZ2dwbG90KG11LAogICAgICAgICAgICAgYWVzKHggPSBXZWVrLAogICAgICAgICAgICAgICAgIHkgPSB4LAogICAgICAgICAgICAgICAgIGdyb3VwID0gVHJ0X0dlbm90eXBlKSkgKwogIGZhY2V0X3dyYXAofiBPcmRlciwKICAgICAgICAgICAgIHNjYWxlID0gImZyZWVfeSIpICsKICBnZW9tX2xpbmUocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjMpKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IFRydF9HZW5vdHlwZSksCiAgICAgICAgICAgICBzaGFwZSA9IDIxLAogICAgICAgICAgICAgc2l6ZSA9IDIsCiAgICAgICAgICAgICBhbHBoYSA9IDAuNSwKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC4zKSkgKwogIHNjYWxlX3hfZGlzY3JldGUoIiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoIlJlbGF0aXZlIEFidW5kYW5jZSAoJSkiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEpKQoKdGlmZihmaWxlbmFtZSA9ICJ0bXAvd3RfT3JkZXJfb3Zlcl90aW1lLnRpZmYiLAogICAgIGhlaWdodCA9IDUsCiAgICAgd2lkdGggPSA3LAogICAgIHVuaXRzID0gImluIiwKICAgICByZXMgPSA2MDAsCiAgICAgY29tcHJlc3Npb24gPSAibHp3K3AiKQpwcmludChwMCkKZ3JhcGhpY3Mub2ZmKCkKCnByaW50KHAwKQpgYGAKCmBgYHtyIG1lYW5zX29fcDEsIGZpZy5oZWlnaHQgPSA1LCBmaWcud2lkdGggPSA5fQpwMSA8LSBnZ3Bsb3QobXUsCiAgICAgICAgICAgICBhZXMoeCA9IHgsCiAgICAgICAgICAgICAgICAgeSA9IE9yZGVyLAogICAgICAgICAgICAgICAgIGNvbG9yID0gVHJ0X0dlbm90eXBlLAogICAgICAgICAgICAgICAgIHNoYXBlID0gV2VlaykpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLAogICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxLAogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX3hfY29udGludW91cygiUmVsYXRpdmUgQWJ1bmRhbmNlICglKSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKCnRpZmYoZmlsZW5hbWUgPSAidG1wL3d0X09yZGVyX3JhLnRpZmYiLAogICAgIGhlaWdodCA9IDQsCiAgICAgd2lkdGggPSA3LAogICAgIHVuaXRzID0gImluIiwKICAgICByZXMgPSA2MDAsCiAgICAgY29tcHJlc3Npb24gPSAibHp3K3AiKQpwcmludChwMSkKZ3JhcGhpY3Mub2ZmKCkKCmdncGxvdGx5KHAxKQpgYGAKCiMjIDMuIEZhbWlseQpgYGB7ciBjb3VudHNfZiwgd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0UsZmlnLndpZHRoPTE1LGZpZy5oZWlnaHQ9MTV9CmNvdW50c19mIDwtIGNvdW50c19ieV90YXhfcmFuayhkdDEgPSBvdHUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncl9ieSA9ICJGYW1pbHkiKQpyYV9mIDwtIHJhX2J5X3RheF9yYW5rKGNvdW50c19mKQoKdGF4LnJhbmtzIDwtIHVuaXF1ZShvdHUxWywgYygiUGh5bHVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFtaWx5IildKQoKcmFfZiA8LSBtZXJnZSh0YXgucmFua3MsCiAgICAgICAgICAgICAgcmFfZiwKICAgICAgICAgICAgICBieSA9ICJGYW1pbHkiKQoKdG90YWwgPC0gcm93U3VtcyhyYV9mWywgMzpuY29sKHJhX2YpXSkKCnJhX2YkRmFtaWx5IDwtIGZhY3RvcihyYV9mJEZhbWlseSwKICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gcmFfZiRGYW1pbHlbb3JkZXIodG90YWwpXSkKCnJhX2YkUGh5bHVtIDwtIGZhY3RvcihyYV9mJFBoeWx1bSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHVuaXF1ZShyYV9mJFBoeWx1bVtvcmRlcih0b3RhbCldKSkKdG1wIDwtIG1lbHQuZGF0YS50YWJsZShkYXRhID0gcmFfZiwKICAgICAgICAgICAgICAgICAgICAgICBpZC52YXJzID0gMToyLAogICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmUudmFycyA9IDM6bmNvbChjb3VudHNfZiksCiAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZSA9ICJTQU1QTEVfTkFNRSIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICJSQSIpCgp0bXAgPC0gbWVyZ2UoZGF0YS50YWJsZShTQU1QTEVfTkFNRSA9IHNtcGwkU0FNUExFX05BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgIFdFRUsgPSBzbXBsJFdFRUssCiAgICAgICAgICAgICAgICAgICAgICAgIFRSRUFUTUVOVCA9IHNtcGwkVFJFQVRNRU5ULAogICAgICAgICAgICAgICAgICAgICAgICBHZW5vdHlwZSA9IHNtcGwkR2Vub3R5cGUpLAogICAgICAgICAgICAgdG1wLAogICAgICAgICAgICAgYnkgPSAiU0FNUExFX05BTUUiKQoKIyBQbG90IHNhbXBsZXMKcDEgPC0gZ2dwbG90KHRtcCwKICAgICAgICAgICAgIGFlcyh4ID0gU0FNUExFX05BTUUsCiAgICAgICAgICAgICAgICAgeSA9IFJBLAogICAgICAgICAgICAgICAgIGZpbGwgPSBGYW1pbHksCiAgICAgICAgICAgICAgICAgY29sb3IgPSBQaHlsdW0pKSArCiAgZmFjZXRfd3JhcCh+IFdFRUsgKyBUUkVBVE1FTlQgKyBHZW5vdHlwZSwKICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlX3giLAogICAgICAgICAgICAgbnJvdyA9IDMpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIHNjYWxlX3hfZGlzY3JldGUoIiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEpKQpnZ3Bsb3RseShwMSkKYGBgCgpgYGB7ciBtZWFuc19mLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQpscmEgPC0gcmFfbWVsdChyYSA9IHJhX2YsCiAgICAgICAgICAgICAgIHNhbXBsZXMgPSBzbXBsLAogICAgICAgICAgICAgICBzYW1wbGVfbmFtZSA9ICJTQU1QTEVfTkFNRSIpCgptdSA8LSBkYXRhLnRhYmxlKGFnZ3JlZ2F0ZShscmEkUkEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gbGlzdChXZWVrID0gbHJhJFdFRUssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVhdG1lbnQgPSBscmEkVFJFQVRNRU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2Vub3R5cGUgPSBscmEkR2Vub3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYW1pbHkgPSBscmEkRmFtaWx5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOID0gIm1lYW4iKSkKbXVbLCB0b3RhbCA6PSBzdW0oeCksCiAgIGJ5ID0gIkZhbWlseSJdCnVsIDwtIHVuaXF1ZShtdVssIGMoIkZhbWlseSIsIAogICAgICAgICAgICAgICAgICAgICJ0b3RhbCIpXSkKdWwgPC0gdWxbb3JkZXIodG90YWwpLF0KbXUkRmFtaWx5IDwtIGZhY3RvcihtdSRGYW1pbHksCiAgICAgICAgICAgICAgICAgICBsZXZlbCA9IHVsJEZhbWlseSkKbXUkdG90YWwgPC0gTlVMTAoKZGF0YXRhYmxlKG11LAogICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSwKICAgICAgICAgIGNhcHRpb24gPSAiVGF4b25vbWljICBjb3VudCB0YWJsZSIsCiAgICAgICAgICBjbGFzcyA9ICJjZWxsLWJvcmRlciBzdHJpcGUiLAogICAgICAgICAgb3B0aW9ucyA9IGxpc3Qoc2VhcmNoID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICBGYW1pbHkgPSBsaXN0KGxpc3QoMywgJ2Rlc2MnKSkpKSAlPiUKICBmb3JtYXRDdXJyZW5jeShjb2x1bW5zID0gNSwKICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9ICIiLAogICAgICAgICAgICAgICAgIG1hcmsgPSAiLCIsCiAgICAgICAgICAgICAgICAgZGlnaXRzID0gMikKYGBgCgpOT1RFOiBvbmx5IHRoZSBmaXJzdCAyNCBmYW1pbGllcyBoYWQgbGFyZ2UgZW5vdWdoIGNvdW50cyAtIHBsb3Rpbmcgb25seSB0aGVtLiAgCiAgCmBgYHtyIG1lYW5zX2ZfcDAsIGZpZy53aWR0aCA9IDksIGZpZy5oZWlnaHQgPSA3fQptdSRUcnRfR2Vub3R5cGUgPC0gZmFjdG9yKHBhc3RlKG11JFRyZWF0bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdSRHZW5vdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiXyIpKQptdTEgPC0gZHJvcGxldmVscyhtdVtGYW1pbHkgJWluJSBsZXZlbHMobXUkRmFtaWx5KVtubGV2ZWxzKG11JEZhbWlseSk6KG5sZXZlbHMobXUkRmFtaWx5KSAtIDI0KV0sIF0pCgpwMCA8LSBnZ3Bsb3QobXUxLAogICAgICAgICAgICAgYWVzKHggPSBXZWVrLAogICAgICAgICAgICAgICAgIHkgPSB4LAogICAgICAgICAgICAgICAgIGdyb3VwID0gVHJ0X0dlbm90eXBlKSkgKwogIGZhY2V0X3dyYXAofiBGYW1pbHksCiAgICAgICAgICAgICBzY2FsZSA9ICJmcmVlX3kiKSArCiAgZ2VvbV9saW5lKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC4zKSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBUcnRfR2Vub3R5cGUpLAogICAgICAgICAgICAgc2hhcGUgPSAyMSwKICAgICAgICAgICAgIHNpemUgPSAyLAogICAgICAgICAgICAgYWxwaGEgPSAwLjUsCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuMykpICsKICBzY2FsZV94X2Rpc2NyZXRlKCIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJSZWxhdGl2ZSBBYnVuZGFuY2UgKCUpIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxKSkKCnRpZmYoZmlsZW5hbWUgPSAidG1wL3d0X0ZhbWlseV9vdmVyX3RpbWUudGlmZiIsCiAgICAgaGVpZ2h0ID0gNywKICAgICB3aWR0aCA9IDksCiAgICAgdW5pdHMgPSAiaW4iLAogICAgIHJlcyA9IDYwMCwKICAgICBjb21wcmVzc2lvbiA9ICJsencrcCIpCnByaW50KHAwKQpncmFwaGljcy5vZmYoKQoKcHJpbnQocDApCmBgYAoKYGBge3IgbWVhbnNfZl9wMSwgZmlnLmhlaWdodCA9IDUsIGZpZy53aWR0aCA9IDl9CnAxIDwtIGdncGxvdChtdTEsCiAgICAgICAgICAgICBhZXMoeCA9IHgsCiAgICAgICAgICAgICAgICAgeSA9IEZhbWlseSwKICAgICAgICAgICAgICAgICBjb2xvciA9IFRydF9HZW5vdHlwZSwKICAgICAgICAgICAgICAgICBzaGFwZSA9IFdlZWspKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywKICAgICAgICAgICAgIGFscGhhID0gMC41KSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMSwKICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoIlJlbGF0aXZlIEFidW5kYW5jZSAoJSkiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCgp0aWZmKGZpbGVuYW1lID0gInRtcC93dF9GYW1pbHlfcmEudGlmZiIsCiAgICAgaGVpZ2h0ID0gNCwKICAgICB3aWR0aCA9IDcsCiAgICAgdW5pdHMgPSAiaW4iLAogICAgIHJlcyA9IDYwMCwKICAgICBjb21wcmVzc2lvbiA9ICJsencrcCIpCnByaW50KHAxKQpncmFwaGljcy5vZmYoKQoKZ2dwbG90bHkocDEpCmBgYAoKIyMgNC4gR2VudXMKYGBge3IgY291bnRzX2csIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLGZpZy53aWR0aD0xNSxmaWcuaGVpZ2h0PTE1fQpjb3VudHNfZyA8LSBjb3VudHNfYnlfdGF4X3JhbmsoZHQxID0gb3R1MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZ3JfYnkgPSAiR2VudXMiKQpyYV9nIDwtIHJhX2J5X3RheF9yYW5rKGNvdW50c19nKQoKdGF4LnJhbmtzIDwtIHVuaXF1ZShvdHUxWywgYygiUGh5bHVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VudXMiKV0pCgpyYV9nIDwtIG1lcmdlKHRheC5yYW5rcywKICAgICAgICAgICAgICByYV9nLAogICAgICAgICAgICAgIGJ5ID0gIkdlbnVzIikKCnRvdGFsIDwtIHJvd1N1bXMocmFfZ1ssIDM6bmNvbChyYV9nKV0pCgpyYV9nJEdlbnVzIDwtIGZhY3RvcihyYV9nJEdlbnVzLAogICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSByYV9nJEdlbnVzW29yZGVyKHRvdGFsKV0pCgpyYV9nJFBoeWx1bSA8LSBmYWN0b3IocmFfZyRQaHlsdW0sCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB1bmlxdWUocmFfZyRQaHlsdW1bb3JkZXIodG90YWwpXSkpCnRtcCA8LSBtZWx0LmRhdGEudGFibGUoZGF0YSA9IHJhX2csCiAgICAgICAgICAgICAgICAgICAgICAgaWQudmFycyA9IDE6MiwKICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlLnZhcnMgPSAzOm5jb2woY291bnRzX2cpLAogICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWUgPSAiU0FNUExFX05BTUUiLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLm5hbWUgPSAiUkEiKQoKdG1wIDwtIG1lcmdlKGRhdGEudGFibGUoU0FNUExFX05BTUUgPSBzbXBsJFNBTVBMRV9OQU1FLAogICAgICAgICAgICAgICAgICAgICAgICBXRUVLID0gc21wbCRXRUVLLAogICAgICAgICAgICAgICAgICAgICAgICBUUkVBVE1FTlQgPSBzbXBsJFRSRUFUTUVOVCwKICAgICAgICAgICAgICAgICAgICAgICAgR2Vub3R5cGUgPSBzbXBsJEdlbm90eXBlKSwKICAgICAgICAgICAgIHRtcCwKICAgICAgICAgICAgIGJ5ID0gIlNBTVBMRV9OQU1FIikKCiMgUGxvdCBzYW1wbGVzCnAxIDwtIGdncGxvdCh0bXAsCiAgICAgICAgICAgICBhZXMoeCA9IFNBTVBMRV9OQU1FLAogICAgICAgICAgICAgICAgIHkgPSBSQSwKICAgICAgICAgICAgICAgICBmaWxsID0gR2VudXMsCiAgICAgICAgICAgICAgICAgY29sb3IgPSBQaHlsdW0pKSArCiAgZmFjZXRfd3JhcCh+IFdFRUsgKyBUUkVBVE1FTlQgKyBHZW5vdHlwZSwKICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlX3giLAogICAgICAgICAgICAgbnJvdyA9IDMpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIHNjYWxlX3hfZGlzY3JldGUoIiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEpKQpnZ3Bsb3RseShwMSkKYGBgCgoKYGBge3IgbWVhbnNfZywgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KbHJhIDwtIHJhX21lbHQocmEgPSByYV9nLAogICAgICAgICAgICAgICBzYW1wbGVzID0gc21wbCwKICAgICAgICAgICAgICAgc2FtcGxlX25hbWUgPSAiU0FNUExFX05BTUUiKQoKbXUgPC0gZGF0YS50YWJsZShhZ2dyZWdhdGUobHJhJFJBLAogICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGxpc3QoV2VlayA9IGxyYSRXRUVLLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlYXRtZW50ID0gbHJhJFRSRUFUTUVOVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbm90eXBlID0gbHJhJEdlbm90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VudXMgPSBscmEkR2VudXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBGVU4gPSAibWVhbiIpKQptdVssIHRvdGFsIDo9IHN1bSh4KSwKICAgYnkgPSAiR2VudXMiXQp1bCA8LSB1bmlxdWUobXVbLCBjKCJHZW51cyIsIAogICAgICAgICAgICAgICAgICAgICJ0b3RhbCIpXSkKdWwgPC0gdWxbb3JkZXIodG90YWwpLF0KbXUkR2VudXMgPC0gZmFjdG9yKG11JEdlbnVzLAogICAgICAgICAgICAgICAgICAgbGV2ZWwgPSB1bCRHZW51cykKbXUkdG90YWwgPC0gTlVMTAoKZGF0YXRhYmxlKG11LAogICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSwKICAgICAgICAgIGNhcHRpb24gPSAiVGF4b25vbWljICBjb3VudCB0YWJsZSIsCiAgICAgICAgICBjbGFzcyA9ICJjZWxsLWJvcmRlciBzdHJpcGUiLAogICAgICAgICAgb3B0aW9ucyA9IGxpc3Qoc2VhcmNoID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICBHZW51cyA9IGxpc3QobGlzdCgzLCAnZGVzYycpKSkpICU+JQogIGZvcm1hdEN1cnJlbmN5KGNvbHVtbnMgPSA1LAogICAgICAgICAgICAgICAgIGN1cnJlbmN5ID0gIiIsCiAgICAgICAgICAgICAgICAgbWFyayA9ICIsIiwKICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKQpgYGAKCmBgYHtyIG1lYW5zX2dfcDAsIGZpZy53aWR0aCA9IDksIGZpZy5oZWlnaHQgPSA3fQptdSRUcnRfR2Vub3R5cGUgPC0gZmFjdG9yKHBhc3RlKG11JFRyZWF0bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdSRHZW5vdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiXyIpKQptdTEgPC0gZHJvcGxldmVscyhtdVtHZW51cyAlaW4lIGxldmVscyhtdSRHZW51cylbbmxldmVscyhtdSRHZW51cyk6KG5sZXZlbHMobXUkR2VudXMpIC0gMzUpXSwgXSkKCnAwIDwtIGdncGxvdChtdTEsCiAgICAgICAgICAgICBhZXMoeCA9IFdlZWssCiAgICAgICAgICAgICAgICAgeSA9IHgsCiAgICAgICAgICAgICAgICAgZ3JvdXAgPSBUcnRfR2Vub3R5cGUpKSArCiAgZmFjZXRfd3JhcCh+IEdlbnVzLAogICAgICAgICAgICAgc2NhbGUgPSAiZnJlZV95IikgKwogIGdlb21fbGluZShwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuMykpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gVHJ0X0dlbm90eXBlKSwKICAgICAgICAgICAgIHNoYXBlID0gMjEsCiAgICAgICAgICAgICBzaXplID0gMiwKICAgICAgICAgICAgIGFscGhhID0gMC41LAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjMpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZSgiIikgKwogIHNjYWxlX3lfY29udGludW91cygiUmVsYXRpdmUgQWJ1bmRhbmNlICglKSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSkpCgp0aWZmKGZpbGVuYW1lID0gInRtcC93dF9HZW51c19vdmVyX3RpbWUudGlmZiIsCiAgICAgaGVpZ2h0ID0gOSwKICAgICB3aWR0aCA9IDEyLAogICAgIHVuaXRzID0gImluIiwKICAgICByZXMgPSA2MDAsCiAgICAgY29tcHJlc3Npb24gPSAibHp3K3AiKQpwcmludChwMCkKZ3JhcGhpY3Mub2ZmKCkKCnByaW50KHAwKQpgYGAKCmBgYHtyIG1lYW5zX2dfcDEsIGZpZy5oZWlnaHQgPSA5LCBmaWcud2lkdGggPSA5fQpwMSA8LSBnZ3Bsb3QobXUxLAogICAgICAgICAgICAgYWVzKHggPSB4LAogICAgICAgICAgICAgICAgIHkgPSBHZW51cywKICAgICAgICAgICAgICAgICBjb2xvciA9IFRydF9HZW5vdHlwZSwKICAgICAgICAgICAgICAgICBzaGFwZSA9IFdlZWspKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywKICAgICAgICAgICAgIGFscGhhID0gMC41KSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMSwKICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoIlJlbGF0aXZlIEFidW5kYW5jZSAoJSkiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCgp0aWZmKGZpbGVuYW1lID0gInRtcC93dF9HZW51c19yYS50aWZmIiwKICAgICBoZWlnaHQgPSA5LAogICAgIHdpZHRoID0gOSwKICAgICB1bml0cyA9ICJpbiIsCiAgICAgcmVzID0gNjAwLAogICAgIGNvbXByZXNzaW9uID0gImx6dytwIikKcHJpbnQocDEpCmdyYXBoaWNzLm9mZigpCgpnZ3Bsb3RseShwMSkKYGBgCgoKCiMgU2Vzc2lvbiBJbmZvcm1hdGlvbgpgYGB7ciBpbmZvLGV2YWw9VFJVRX0Kc2Vzc2lvbkluZm8oKQpgYGA=